#ifndef __WORK_QUE_H__
#define __WORK_QUE_H__
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/time.h>
#include <strings.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#include <shadow.h>
#include <crypt.h>
typedef struct tag_node{
    int new_fd;
    char filename[100];//文件名
    int code;//code为0代表是根，code为正，code是当前路径
    int state;//state是GETS,或者PUTS
    char user_name[50];//哪一个用户发过来的gets或者puts请求
    off_t offset;//为GETS服务，传递的偏移值
    struct tag_node *pNext;
}Node_t,*pNode_t;

typedef struct{
    pNode_t que_head,que_tail;//队列头队列尾
    int que_capacity;//队列能力，可以计算当前服务器的负载
    int que_size;//当前队列大小
    pthread_mutex_t mutex;
}trans_Que_t,*ptQue_t;

typedef struct Client_State_t{
    int new_fd;//对应客户端连接
    int code;//code为0代表是根，code为正，直接数据库select
    char token[25];//一旦登录，随机生成一个token并发送给客户端
    char user_name[20];
    struct Client_State_t* next;
}Client_State_t,*pClient_State_t;

typedef struct normal_Que_t{
    pClient_State_t que_head,que_tail;
}normal_Que_t,*pnQue_t;

void que_init(ptQue_t pq,int que_capacity);
//放元素到队列
void que_set(ptQue_t pq,pNode_t pnew);
//拿队列元素
void que_get(ptQue_t pq,pNode_t *p);

#endif